import { createSlice, Slice } from '@reduxjs/toolkit';
import type { PayloadAction } from '@reduxjs/toolkit';
import { IUserData } from '../../types/userDataType';

/**
 * @typedef { Object } IUserState - Интерфейс для сохранения состояния данных пользователя.
 * @property { IUserData } userData - Объект данных пользователя.
 */
export interface IUserState {
    userData: IUserData;
}

/**
 * Объект для инициализации начального состояния хранилища.
 * @type { IUserData }
 */
const initialState: IUserState = {
    userData: null
};

/**
 * Создание фрагмента хранилища.
 * @type { 
 *  Slice<
 *      IUserState,
 *      {setUserData: (state: IUserState, action: PayloadAction<IUserData>) => {userData: IUserData;};},
 *      "user"
 *      > 
 * }
 */
export const userSlice: Slice<
    IUserState,
    {
        setUserData: (state: IUserState, action: PayloadAction<IUserData>) => {
            userData: IUserData;
        };
    },
    "user"
> = createSlice({
    name: 'user',
    initialState,
    reducers: {
        /**
        * @function setUserData - Устанавливает данные пользователя в состоянии.
        * @param {IUserState} state - Текущее состояние.
        * @param {PayloadAction<IUserData>} action - Действие с полезной нагрузкой, содержащее данные пользователя.
        * @return {IUserState} - Обновленное состояние с установленными данными пользователя.
        */
        setUserData: (state: IUserState, action: PayloadAction<IUserData>) => ({
            userData: action.payload
        })
    }
});

export const { setUserData } = userSlice.actions;
export default userSlice.reducer;